#include "stdafx.h"
#include "Bookmark.h"
#include <algorithm>
using std::find;
typedef ordered_vector<int>::iterator VI;

void Bookmark::ClearBookmarks()
{
	nonameTag.clear();
}

void Bookmark::ToggleBookmark(int line)
{
	if(IsBookmark(line))
	{
		nonameTag.erase(line);
	}
	else
	{
		nonameTag.insert(line);
	}
}

int Bookmark::GetNextBookmarkLine(int nowLine)
{
	if(!nonameTag.empty())
	{
		for(VI vi = nonameTag.begin(); vi != nonameTag.end(); vi++)
		{
			if((*vi) > nowLine) return *vi;
		}
		return nonameTag.front();
	}
	else
	{
		return -1;
	}
}

int Bookmark::GetPrevBookmarkLine(int nowLine)
{
	typedef vector<int>::reverse_iterator RVI;

	if(!nonameTag.empty())
	{
		for(RVI rvi = nonameTag.rbegin(); rvi != nonameTag.rend(); rvi++)
		{
			if((*rvi) < nowLine) return *rvi;
		}
		return nonameTag.back();
	}
	else
	{
		return -1;
	}
}

bool Bookmark::IsBookmark(int line)
{
	return find(nonameTag.begin(), nonameTag.end(), line) != nonameTag.end();
}

void Bookmark::MoveBookmarks(int lineFrom, int amount)
{
	if(!nonameTag.empty())
	{
		VI vi;
		for(vi = nonameTag.begin(); vi != nonameTag.end(); vi++)
		{
			if((*vi) >= lineFrom) break;
		}
		
		for(; vi != nonameTag.end(); vi++)
		{
			if(*vi + amount < lineFrom)
			{
				nonameTag.erase(*vi);
			}
			else
			{
				nonameTag[vi - nonameTag.begin()] += amount;
			}
		}
	}
}

Bookmark::Bookmark(void)
{
	ClearBookmarks();
}

Bookmark::~Bookmark(void)
{
}
